<?

define('GCC_API_BASE', 'http://172.18.0.18:8081/');

define('UUID_GEN_URL',	GCC_API_BASE.'uuid.gen?count=');	// 
define('PERSON_VALIDATE_URL',	GCC_API_BASE.'person.validate');	// 
define('PERSON_STORE_URL',	GCC_API_BASE.'person.store');	// 
define('ISSUE_STORE_URL',	GCC_API_BASE.'issue.store');	// 
define('GET_ATTACH_URL',	GCC_API_BASE.'download.attach?attach_id=');	// 
define('INTERVIEW_LIST_URL',	GCC_API_BASE.'interview.api?action=list_int');	// 
define('INTERVIEW_URL',	GCC_API_BASE.'/interview.api?action=get_int');	// 
define('INTERVIEW_STORE_URL',	GCC_API_BASE.'/interview.api?action=save_ans');	// 
define('CHANGE_EMAIL_URL',	GCC_API_BASE.'/cc.api?method=change.email');	// 


define('TK_NEW_USER',	1);	// cs_ticket: ticket kind: create new user
define('TK_RECOVER_PASS',	2);	// cs_ticket: ticket kind: recover password
define('TK_CHANGE_MAIL',	3);	// cs_ticket: ticket kind: change e-mail

define('AI_REGULAR_USER',	2);	// cs_person: map a regular virtual user to the site user (key at si_auth: 2 = registered)




function gccLoggedIn() {
	return (int)gccUserInfo('id', 0);
}

function gccUserInfo($p, $def='') {
	return (session_exists() && isset($_SESSION['user']['vuser'][$p])) ? $_SESSION['user']['vuser'][$p] : $def;
}

function gccHuuid($id) {
	return preg_replace('/[^\d-]/', '', trim($id));
}


function gccGetUUID($count = 1) {
	
	$addr = UUID_GEN_URL.($count = (int)$count);
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
//	curl_setopt($ch, CURLOPT_POST, 1);


	$res = curl_exec($ch);

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch));
	else {
		$res = explode(',', $res);
		if ($count == 1)
			$res = $res[0];
	}
	
	curl_close($ch);
	return $res;

}

function gccPersonValidate($request = false) {
	
	if (!$request) $request = $_POST;
	
	$addr = PERSON_VALIDATE_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);

	$raw = curl_exec($ch);
//debug($raw, 'res');

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'validated' => false);
	else {
		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'validated' => false);
		else {
			$all = true; foreach($res as $v) if (!$v[1]) { $all = false; break; }
			if ($all) {
				$res = array('errno' => 0, 'error' => '', 'data' => $res, 'validated' => true, 'raw' => $raw);
			} else {
				$res = array('errno' => -2, 'error' => 'Not valid', 'data' => $res, 'validated' => false, 'raw' => $raw);
			}
		}
	}
	
	curl_close($ch);
	return $res;

}


function gccPersonStore($request = false) {
	
	$addr = PERSON_STORE_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//debug($request);
	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);
//debug($r);

	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);


	$raw = curl_exec($ch);
//debug($raw, 'raw');

	if (curl_errno($ch)) {
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'stored' => false);
	} else {

		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'stored' => false);
		else

		if (isset($res['result'])) {

			if ($res['result'] == "ok")
				$res = array('errno' => 0, 'error' => '', 'stored' => true, 'raw' => $raw, 'data' => $res['data']);
			else
			
			if ($res['result'] == "error")
				$res = array('errno' => -3, 'error' => $res['data'], 'data' => false, 'stored' => false, 'raw' => $raw);
			else
			
			$res = array('errno' => -4, 'error' => 'Strange result', 'data' => $res, 'stored' => false, 'raw' => $raw);

		} else
		
		$res = array('errno' => -2, 'error' => 'Not valid', 'data' => $res, 'stored' => false, 'raw' => $raw);
	}
	
	curl_close($ch);
	return $res;

}


function gccClaimStore($request = false) {

	$addr = ISSUE_STORE_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//debug($request);
	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

//debug($r);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);

	$raw = curl_exec($ch);

	if (curl_errno($ch)) {
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'stored' => false);
	} else {

		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'stored' => false);
		else

		if (isset($res['result'])) {

			if ($res['result'] == "ok")
				$res = array('errno' => 0, 'error' => '', 'stored' => true, 'raw' => $raw, 'data' => $res['data']);
			else
			
			if ($res['result'] == "error")
				$res = array('errno' => -3, 'error' => $res['data'], 'data' => false, 'stored' => false, 'raw' => $raw);
			else
			
			$res = array('errno' => -4, 'error' => 'Strange result', 'data' => $res, 'stored' => false, 'raw' => $raw);

		} else
		
		$res = array('errno' => -2, 'error' => 'Not valid', 'data' => $res, 'stored' => false, 'raw' => $raw);
	}
	
	curl_close($ch);
	return $res;

}

function gccGetGeoNames($list, $suffix = '_title') {
	$keys = array();
	if (is_array($list)) {
		foreach($list as $k => $v) if ($id = gccHuuid($v)) $keys[] = $id;
	} else 
		$keys[] = gccHuuid($list);
	$keys = implode(',', $keys);

	$res = array();

	if (sizeof($d = datafetch_array('db_list',
		array('table' => 'CC_GEO_OBJECT o, CC_GEO_PROPERTY p', 'index' => 'id', 
			'where' => "o.property_id=p.id AND o.id IN ($keys)",
			'select' => 'o.id id, p.koatuu_name name'
			)))) {
//debug($d, 'd');		
		foreach($list as $k => $v) {
			if (isset($d[$v]))
				$res[$k.$suffix] = $d[$v]['name'];
		}
//debug($res, 'res');		
	}
	return $res;
}


function gccLoadPerson($id) {
	$id = gccHuuid($id);
//dbdebug(1,1);
	if ($d = datafetch('db_item', 'cc_person', "id=$id", "cc_person.*, TO_CHAR(birthday, 'DD.MM.YYYY') birthday_formatted")) {

		$person_id = $d['id'];
		unset($d['id']);

		switch($d['persontype_id']) {
			case 'G': 	// public organization
				if (sizeof($t = datafetch_array('db_item', 'cc_person_public', "person_id=$person_id"))) {
					unset($t['id']);
					$t['edrpou'] = $t['okpo'];
				}

				$t = array_merge($t, gccGetGeoNames(array('fact_geo_id' => $d['fact_geo_id'], 'low_geo_id' => $d['low_geo_id'])));
				break;

			case 'U': 	// law face
				if (sizeof($t = datafetch_array('db_item', 'cc_person_legal', "person_id=$person_id"))) {
					unset($t['id']);
					$t['edrpou'] = $t['okpo'];
				}

				$t = array_merge($t, gccGetGeoNames(array('fact_geo_id' => $d['fact_geo_id'], 'low_geo_id' => $d['low_geo_id'])));
				break;

			case 'C': 	// comm face
				if (sizeof($t = datafetch_array('db_item', 'cc_person_community', "person_id=$person_id"))) {
					unset($t['id']);
					$t['edrpou'] = $t['okpo'];
				}

				$t = array_merge($t, gccGetGeoNames(array('fact_geo_id' => $d['fact_geo_id'], 'low_geo_id' => $d['low_geo_id'])));
				break;

			case 'F': // physic
			default: 	// unknown
				$t = gccGetGeoNames(array('fact_geo_id' => $d['fact_geo_id']));
				break;
		}

//debug(array_merge($d, $t), 'd', 1);
//exit;	
		
		return array_merge($d, $t);
	}
	
	return array();
}

function gccGetFile($request = false) {

	$addr = GET_ATTACH_URL.gccHuuid($request);
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, true);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
//	curl_setopt($ch, CURLOPT_POST, 1);

//debug($request);
//	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

//	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);

	$raw = curl_exec($ch);
	$r = explode("\r\n\r\n", $raw);
//debug($r[0]);

preg_match('/Disposition: filename=([^\r].*)/', $r[0], $res);

//debug($res[1]);
	if (curl_errno($ch)) {
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch));
	} else {
		$res = array('errno' => 0, 'error' => '', 'filename' => $res[1], 'data' => $r[1]);;
	}
	
	curl_close($ch);
	return $res;

}


function gccGetInterviewList($request = false) {
	
	if (!$request) return false;
	
	$addr = INTERVIEW_LIST_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

	$r = json_encode(array('data' => $request));

	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);
//debug($r);
	$raw = curl_exec($ch);
//debug($raw, 'res');

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'status' => false);
	else {
		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'status' => false);
		else
			$res = array('status' => $res['status'], 'raw' => $raw);
	}
	
	curl_close($ch);
//debug($res);	
	return $res;
}

function gccGetInterview($request = false) {
	
	if (!$request) return false;
	
	$addr = INTERVIEW_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

	$r = 'data='.json_encode($request);
//debug($r);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);

	$raw = curl_exec($ch);
//debug($raw, 'res');

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'status' => false);
	else {
		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'status' => false);
		else
			$res = array('status' => $res['status'], 'raw' => $raw);
	}
	
	curl_close($ch);
	return $res;
}


function gccStoreInterview($request = false) {
	
	if (!$request) return false;
	
	$addr = INTERVIEW_STORE_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

	$r = 'data='.json_encode($request);
//debug($r);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);

	$raw = curl_exec($ch);
//debug($raw, 'res');

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'status' => false);
	else {
		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'status' => false);
		else
			$res = array('status' => $res['status'], 'raw' => $raw);
	}
	
	curl_close($ch);
	return $res;
}


function gccGeoToRoot($parent) {
	$koatuu_table = 'CC_GEO_OBJECT o, CC_GEO_PROPERTY p';

	$res = array();
//	dbdebug();
	
	$id = gccHuuid($parent);
	
	while ($id && $d = datafetch('db_item', $koatuu_table, 
		"o.property_id=p.id AND o.id=$id", 'o.id id, p.koatuu_name name, o.parent_id parent_id')) {
		
		$res[] = array('id' => $d['id'], 'name' => $d['name']);
		$id = $d['parent_id'];
	}
	
	return array_reverse($res);
}

function gccGeoToRootJoin($parent, $last = true) {
	$res = gccGeoToRoot($parent);
	if (!$last) { $res.pop(); }

	$t = array();
	foreach ($res as $v) $t[] = $v['name'];

	return implode(', ', $t);
}

function gccGeoTitleById($id) {
	$koatuu_table = 'CC_GEO_OBJECT o, CC_GEO_PROPERTY p';

	$res = '';
	//dbdebug();
	
	$id = gccHuuid($id);
	
	if ($id && $d = datafetch('db_item', $koatuu_table, 
		"o.property_id=p.id AND o.id=$id", 'o.id id, p.koatuu_name name, o.parent_id parent_id')) {
		
		$res = $d['name'];
	}
	
	return $res;
}

function gccProblemToRoot($parent) {
	$_table = 'CR_CLASSIFICATOR_VALUE o';
	$_parent_key = 'classificatorvalue_id';

	$_magic = "classificator_id=1 AND state='A' AND onsite=1";

	$res = array();
	//dbdebug();
	
	$id = gccHuuid($parent);
	
	while ($id && $d = datafetch('db_item', $_table, 
		"$_magic AND id=$id", "id, name, $_parent_key parent_id")) {
		
		$res[] = array('id' => $d['id'], 'name' => $d['name']);
		$id = $d['parent_id'];
	}
	
	return array_reverse($res);
}


function gccProblemTitleById($id) {
	$_table = 'CR_CLASSIFICATOR_VALUE o';
	$_parent_key = 'classificatorvalue_id';

	$_magic = "classificator_id=1 AND state='A' AND onsite=1";

	$res = '';
//dbdebug();
	
	$id = gccHuuid($id);
	
	if ($id && $d = datafetch('db_item', $_table, 
		"$_magic AND id=$id", "id, name, $_parent_key parent_id")) {
		
		$res = $d['name'];
	}
	
	return $res;
}


function gccChangeEmail($request = false) {
	
	if (!$request) return false;
	
	$addr = CHANGE_EMAIL_URL;
	
	# Инициализируем CURL нужным URL
	$ch = curl_init($addr);

	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);

	# В выводе CURL http-заголовки не нужны
	curl_setopt($ch, CURLOPT_HEADER, 0);

	# Возвращать результат, а не выводить его в stdout
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	# Метод http-запроса POST
	curl_setopt($ch, CURLOPT_POST, 1);

//	$r = array(); foreach ($request as $k => $v) $r[] = "$k=".urlencode($v); $r = implode('&', $r);

	$r = 'data='.json_encode($request);

	curl_setopt($ch, CURLOPT_POSTFIELDS, $r);
//debug($r);
	$raw = curl_exec($ch);
//debug($raw, 'res');

	if (curl_errno($ch)) 
		$res = array('errno' => curl_errno($ch), 'error' => curl_error($ch), 'status' => false);
	else {
		if (!($res = json_decode($raw, true)))
			$res = array('errno' => -1, 'error' => 'Bad json', 'status' => false);
		else
			$res = array('status' => $res['status'], 'raw' => $raw);
	}
	
	curl_close($ch);
//debug($res);	
	return $res;
}
